# 文件名: function_examples.py
# 说明: Python3 函数示例合集

print("\n--- 示例1: 基础函数定义与调用 ---")
def greet(name):
    """返回欢迎消息（文档字符串说明函数功能）"""
    return f"Hello, {name}!"

print(greet("Alice"))  # Hello, Alice!
print(greet.__doc__)   # 输出函数的文档字符串


print("\n--- 示例2: 参数类型 ---")
# 2.1 位置参数
def power(base, exponent):
    return base ** exponent
print("位置参数:", power(2, 3))  # 8

# 2.2 默认参数
def greet_v2(name, greeting="Hello"):
    return f"{greeting}, {name}!"
print("默认参数:", greet_v2("Bob"))          # Hello, Bob!
print("覆盖默认:", greet_v2("Bob", "Hi"))    # Hi, Bob!

# 2.3 可变参数 (*args)
def sum_all(*numbers):
    total = 0
    for num in numbers:
        total += num
    return total
print("可变参数:", sum_all(1, 2, 3, 4))  # 10

# 2.4 关键字参数 (**kwargs)
def build_profile(**info):
    profile = {}
    for key, value in info.items():
        profile[key] = value
    return profile
print("关键字参数:", build_profile(name="Alice", age=25, city="北京"))


print("\n--- 示例3: 返回值与多返回 ---")
def split_name(full_name):
    names = full_name.split()
    return names[0], names[1]  # 返回元组

first, last = split_name("John Doe")
print("多返回值:", first, last)  # John Doe


print("\n--- 示例4: 作用域规则 ---")
global_var = 100  # 全局变量

def scope_test():
    local_var = 200          # 局部变量
    global global_var        # 声明使用全局变量
    global_var = 300         # 修改全局变量
    print("局部访问:", local_var, global_var)

scope_test()                 # 局部访问: 200 300
print("全局访问:", global_var)  # 全局访问: 300


print("\n--- 示例5: 闭包（Closure） ---")
def outer_func(x):
    def inner_func(y):
        return x + y  # 捕获外部函数的变量x
    return inner_func

closure = outer_func(10)
print("闭包调用:", closure(5))  # 15


print("\n--- 示例6: 装饰器（Decorator） ---")
# 装饰器函数（增强原函数功能）
def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"正在调用函数: {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def multiply(a, b):
    return a * b

print("装饰器结果:", multiply(3, 4))  # 先打印日志，再返回12


print("\n--- 示例7: 递归函数 ---")
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

print("5的阶乘:", factorial(5))  # 120


print("\n--- 示例8: Lambda 表达式 ---")
# 匿名函数常用于简单逻辑
square = lambda x: x ** 2
print("Lambda平方:", square(5))  # 25


print("\n--- 示例9: 函数作为参数传递 ---")
def apply_operation(func, numbers):
    return [func(num) for num in numbers]

def double(x):
    return x * 2

nums = [1, 2, 3]
print("传递函数:", apply_operation(double, nums))  # [2, 4, 6]


print("\n--- 关键点总结 ---")
print("1. 参数类型: 位置参数、默认参数、可变参数(*args)、关键字参数(**kwargs)")
print("2. 作用域: 局部变量 > 嵌套作用域 > 全局变量 > 内置变量（LEGB规则）")
print("3. 闭包: 内部函数捕获外部函数变量，用于保留状态")
print("4. 装饰器: @语法糖，动态增强函数功能")
print("5. 递归: 需设置终止条件，避免栈溢出")
print("6. 文档字符串: 使用 ''' 或 \"\"\" 定义，通过 __doc__ 访问")